package com.intellekt.ecert.users.action;

import static org.apache.commons.lang3.StringUtils.isAlphanumeric;
import static org.apache.commons.lang3.StringUtils.isAlphanumericSpace;
import static org.apache.commons.lang3.StringUtils.isBlank;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.intellekt.ecert.domain.SuperAction;
import com.intellekt.ecert.domain.UsuarioVO;
import com.intellekt.ecert.users.service.UsersService;

public class UsersAsyncAction extends SuperAction {

	/**
     * 
     */
	private static final long serialVersionUID = -6536964772985551843L;

	private static final Logger log = Logger.getLogger(UsersAsyncAction.class);

	private static final String DIV_USERNAME = "div.username";
	private static final String DIV_NOMBRE = "div.nombre";
	private static final String DIV_ROL = "div.rolId";
	private static final String DIV_PAIS = "div.pais";
	private static final String DIV_PASSWORD= "div.password";
	
	private String jsonrecords;
	private UsuarioVO parametro;
	private String idTipoCertificado;
	private String idMercancia;
	private String username;

	@Autowired
	private UsersService service;

	public String execute() throws Exception {

		if (log.isInfoEnabled()) {
			log.info("execute...");
		}

		JSONObject messages = new JSONObject();
		JSONArray divs = new JSONArray();
		JSONArray alerts = new JSONArray();
		boolean success = true;

		try {

			Map<Object, Object> resultSet = new HashMap<Object, Object>();
			List<Map<Object, Object>> mapResult = new ArrayList<Map<Object, Object>>();

			List<UsuarioVO> lista = service.getUsers();

			for (UsuarioVO vo : lista) {
				Map<Object, Object> map = new HashMap<Object, Object>();

				map.put("username", vo.getUsername());
				map.put("password", vo.getPassword());
				map.put("nombre", vo.getNombre());
				map.put("vigente", vo.isVigente()? "A": "I");
				map.put("pais", vo.getPais());
				map.put("idPais", vo.getIdPais());
				map.put("idRol", vo.getRolId());
				map.put("rol", vo.getRol());
				map.put("nuevo", false);
				map.put("modificado", false);
				map.put("eliminado", false);

				mapResult.add(map);
			}
			resultSet.put("Result", mapResult);
			messages.put("ResultSet", resultSet);

		} catch (Exception e) {
			log.error("error", e);
			success = false;
			messages.put(JSON_EXCEPTION, e.toString());
		} finally {
			messages.put(JSON_DIVS, divs);
			messages.put(JSON_ALERTS, alerts);
			messages.put(JSON_SUCCESS, success);
			if (log.isDebugEnabled()) {
				log.debug(messages.toString(1));
			}
			streamIt(messages);
		}

		return STREAM;

	}

	
	public String validar() throws Exception {
		if (log.isInfoEnabled()) {
			log.info("validar...");
			log.info("validar..."+parametro.toString());
		}
		JSONObject messages = new JSONObject();
		JSONArray divs = new JSONArray();
		JSONArray alerts = new JSONArray();
		boolean success = true;
		String msgError = null;

		try {
			if (parametro.isNuevo()) {
				/**
				 * Validar el username del usuario cuando sea nuevo
				 */
				String username = parametro.getUsername();
				msgError = "";
				if (isBlank(username)) {
					success = false;
					msgError = this.getText("segusuarios.username.blank");
				}
				if (!isAlphanumeric(username)) {
					success = false;
					msgError = this.getText("segusuarios.username.incorrecto");
				}
				if (service.userExist(username.toUpperCase())) {
					msgError = "Ya existe un usuario con el username " + username;
					success = false;
				}
				divs.add(getDivYMensaje(DIV_USERNAME, msgError));
				
				boolean errorRol = false;
				String rol = parametro.getRolId();
				msgError = "";
				if (isBlank(rol)) {
					errorRol = true;
					msgError = this.getText("segusuarios.rol.blank");
				}
				if (errorRol) {
					success = false;
				}
				divs.add(getDivYMensaje(DIV_ROL, msgError));
			}
			/**
			 * Validar el nombre del usuario
			 */
			boolean errorNombre = false;
			String nombre = parametro.getNombre();
			msgError = "";
			if (isBlank(nombre)) {
				errorNombre = true;
				msgError = this.getText("segusuarios.nombre.blank");
			} else if (nombre.trim().length() > 100) {
				errorNombre = true;
				msgError = this.getText("segusuarios.nombre.longitud");
			}
			if (!isAlphanumericSpace(nombre)) {
				errorNombre = true;
				msgError = this.getText("segusuarios.username.incorrecto");
			}
			if (errorNombre) {
				success = false;
			}
			divs.add(getDivYMensaje(DIV_NOMBRE, msgError));


			boolean errorPassword = false;
			String password = parametro.getPassword();
			msgError = "";
			if (isBlank(password)) {
				errorPassword = true;
				msgError = this.getText("segusuarios.nombre.blank");
			} else if (nombre.trim().length() > 100) {
				errorPassword = true;
				msgError = this.getText("segusuarios.nombre.longitud");
			}
			if (!isAlphanumericSpace(password)) {
				errorPassword = true;
				msgError = this.getText("segusuarios.username.incorrecto");
			}
			if (errorPassword) {
				success = false;
			}
			divs.add(getDivYMensaje(DIV_PASSWORD, msgError));
			
			
			

			boolean errorPais = false;
			String pais = parametro.getIdPais();
			msgError = "";
			if (isBlank(pais)) {
				errorPais = true;
				msgError = this.getText("segusuarios.mail.blank");
			}
			if (errorPais) {
				success = false;
			}
			divs.add(getDivYMensaje(DIV_PAIS, msgError));


		} catch (Exception e) {
			log.error("error", e);
			success = false;
			messages.put(JSON_EXCEPTION, e.toString());
		} finally {
			messages.put(JSON_DIVS, divs);
			messages.put(JSON_ALERTS, alerts);
			messages.put(JSON_SUCCESS, success);
			if (log.isDebugEnabled()) {
				log.debug(messages.toString(1));
			}
			streamIt(messages);
		}
		return STREAM;
	}
	

	public String guardarUsuario() throws Exception {

		if (log.isDebugEnabled()) {
			log.debug("guardarUsuario...");
		}

		JSONObject messages = new JSONObject();
		JSONArray divs = new JSONArray();
		JSONArray alerts = new JSONArray();
		boolean success = true;

		try {

			Map<Object, Object> resultSet = new HashMap<Object, Object>();
			List<Map<Object, Object>> mapResult = new ArrayList<Map<Object, Object>>();

			List<UsuarioVO> lista = parseJsonUsuario(jsonrecords);
			log.debug("adsnhsadhjsadjk "+lista.size());
			service.saveUser(lista);
			
			resultSet.put("Result", mapResult);
			messages.put("ResultSet", resultSet);

		} catch (Exception e) {
			log.error("error", e);
			success = false;
			messages.put(JSON_EXCEPTION, e.toString());
		} finally {
			messages.put(JSON_DIVS, divs);
			messages.put(JSON_ALERTS, alerts);
			messages.put(JSON_SUCCESS, success);
			if (log.isDebugEnabled()) {
				log.debug(messages.toString(1));
			}
			streamIt(messages);
		}

		return STREAM;

	}
	
	@SuppressWarnings("rawtypes")
	private final List<UsuarioVO> parseJsonUsuario(String jsonString) throws RuntimeException {
		try {

			List<UsuarioVO> registros = new ArrayList<UsuarioVO>();

			if (jsonString != null) {
				JSONArray jsonArray = JSONArray.fromObject(jsonString);
				if (log.isDebugEnabled()) {
					log.debug("jsonArray.size() = > [ " + jsonArray.size() + " ]");
				}
				boolean nuevo = false;
				boolean modificado = false;
				boolean activo = false;
				boolean eliminado = false;
				String username, password, nombre,  rol, idRol, idPais, pais;
				
				UsuarioVO tmp = null;
				Iterator it = jsonArray.iterator();
				while (it.hasNext()) {
					JSONObject jsonObject = (JSONObject) it.next();

					nuevo = super.parseJsonBoolean(jsonObject, "nuevo");
					modificado = super.parseJsonBoolean(jsonObject, "modificado");
					eliminado = super.parseJsonBoolean(jsonObject, "eliminado");
					if (modificado == true || nuevo == true || eliminado == true) {
						username = parseJsonString(jsonObject, "username");
						password = parseJsonString(jsonObject, "password");
						nombre = parseJsonString(jsonObject, "nombre");
						rol = parseJsonString(jsonObject, "rol");
						idRol = parseJsonString(jsonObject, "idRol");
						idPais = parseJsonString(jsonObject, "idPais");
						pais = parseJsonString(jsonObject, "pais");
						activo = (parseJsonString(jsonObject, "vigente").equals("A")?true:false);
						
						
						tmp = new UsuarioVO();
						tmp.setUsername(username);
						tmp.setNombre(nombre);
						tmp.setRol(rol);
						tmp.setRolId(idRol);
						tmp.setIdPais(idPais);
						tmp.setPais(pais);
						tmp.setVigente(activo);
						tmp.setPassword(password);
						tmp.setNuevo(nuevo);
						tmp.setModificado(modificado);
						tmp.setEliminado(eliminado);
						registros.add(tmp);

					}

				}
			}

			return registros;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	

	public String getJsonrecords() {
		return jsonrecords;
	}

	public void setJsonrecords(String jsonrecords) {
		this.jsonrecords = jsonrecords;
	}

	public void setParametro(UsuarioVO parametro) {
		this.parametro = parametro;
	}

	public UsuarioVO getParametro() {
		return parametro;
	}


	public String getIdTipoCertificado() {
		return idTipoCertificado;
	}


	public void setIdTipoCertificado(String idTipoCertificado) {
		this.idTipoCertificado = idTipoCertificado;
	}


	public String getIdMercancia() {
		return idMercancia;
	}


	public void setIdMercancia(String idMercancia) {
		this.idMercancia = idMercancia;
	}


	public String getUsername() {
		return username;
	}


	public void setUsername(String username) {
		this.username = username;
	}

	

}
